import axios from "axios";
import path from "path";
import fs from "fs";

import type { AxiosResponse, AxiosRequestConfig } from "axios";

const Cookie = fs.readFileSync(path.join(__dirname, "Cookie"), "utf8");
const defaultHeaders = {
  "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
  Referer: "https://www.bilibili.com/",
  Cookie,
};

const instance = axios.create();

getObjectKeys(defaultHeaders).forEach(
  (key) => (instance.defaults.headers.common[key] = defaultHeaders[key])
);

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

function getObjectKeys<T extends object>(obj: T): Array<keyof T> {
  return Object.keys(obj) as Array<keyof T>;
}

export const request = async <T = any, D = any>(config: AxiosRequestConfig) => {
  if (config.method === "get") {
    config.params = config.data;
    delete config.data;
  }
  const result = await instance.request<T, AxiosResponse<T, D>, D>(config);
  return result.data;
};
